#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Ejemplos para resolver - Soluciones

import cmd
import cv
import cv2
from cv2 import startWindowThread

filename = "beach.png"
startWindowThread()


class Point():
    """Clase punto"""

    def __init__(self, x, y):
        self.x = x
        self.y = y


def example1():
    """
    *******************************************************
    Ejemplo 1:
    Abrir una foto con la librería OpenCV:
    *******************************************************
    """

    img = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_UNCHANGED)
    # Cargamos la imagen que le pasamos al programa como argumento
    # cv.CV_LOAD_IMAGE_UNCHANGED nos permite cargar la imagen utilizando los
    # canales tal como están en la imagen original

    cv.NamedWindow("Ejemplo1", cv.CV_WINDOW_AUTOSIZE)
    # Creamos una ventana con el nombre Ejemplo 1. El parametro
    # CV_WINDOW_AUTOSIZE ajusta el tamaño de la ventana al tamaño de la imagen
    # automaticamente

    cv.ShowImage("Ejemplo1", img)
    # Mostramos la imagen en la ventana anteriormente creada

    cv.WaitKey(0)  # Se queda esperando a que se presione una tecla
    cv.DestroyWindow("Ejemplo1")  # Destruimos la ventana


def example2():
    """
    *******************************************************
    Ejemplo 2:
    Dibujar un rectángulo en una imagen:
    *******************************************************
    """

    img = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_UNCHANGED)

    cv.NamedWindow("Ejemplo2", cv.CV_WINDOW_AUTOSIZE)
    # Creamos una ventana con el nombre Ejemplo 2
    pt1_x = 100
    pt1_y = 10
    pt2_x = 220
    pt2_y = 150

    cv.Rectangle(img, (pt1_x, pt1_y), (pt2_x, pt2_y),
        cv.CV_RGB(0, 0, 255), 3, 8, 0)
    # Dibujamos el rectángulo

    cv.ShowImage("Ejemplo2", img)
    # Mostramos la imagen en la ventana anteriormente creada

    cv.WaitKey(0)  # Se queda esperando a que se presione una tecla
    cv.DestroyWindow("Ejemplo2")  # Destruimos la ventana


def example3():
    """
    # *******************************************************
    # Ejemplo 3:
    # Crear una región de interés y mostrarla en otra ventana:
    # *******************************************************
    """

    pt1 = Point(0, 0)
    pt2 = Point(0, 0)

    img = cv2.imread(filename)
    cv2.namedWindow("Ejemplo3", cv2.CV_WINDOW_AUTOSIZE)
    cv2.namedWindow("ROI", cv2.CV_WINDOW_AUTOSIZE)
    # Creamos una ventana con el nombre ROI donde estará la región de interés

    pt1.x = 100
    pt1.y = 10
    pt2.x = 220
    pt2.y = 150

    cv2.imshow("Ejemplo3", img)  # Mostramos la imagen en la ventana

    img = img[pt1.x:pt2.x, pt1.y:pt2.y]

    cv2.imshow("ROI", img)  # Mostramos la imagen en la ventana

    cv2.waitKey(0)  # Se queda esperando a que se presione una tecla
    cv2.destroyWindow("Ejemplo3")  # Destruimos la ventana
    cv2.destroyWindow("ROI")  # Destruimos la ventana


def example4():
    """
    *******************************************************
    Ejemplo 4:
    Cambiar el tamaño de una imagen:
    *******************************************************
    """

    img = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_UNCHANGED)
    ampl = cv.CreateImage((500, 500), cv.IPL_DEPTH_8U, 4)
    # Creamos la imagen para almacenar la versión ampliada

    cv.NamedWindow("Ejemplo4", cv.CV_WINDOW_AUTOSIZE)
    cv.NamedWindow("AMP", cv.CV_WINDOW_AUTOSIZE)

    cv.Resize(img, ampl, cv.CV_INTER_CUBIC)  # Escalado de la imagen, ajustando
    # al tamaño de la imagen de destino.

    # Mostramos los resultados
    cv.ShowImage("Ejemplo4", img)
    cv.ShowImage("AMP", ampl)

    cv.WaitKey(0)  # Se queda esperando a que se presione una tecla
    cv.DestroyWindow("Ejemplo4")  # Destruimos la ventana
    cv.DestroyWindow("AMP")  # Destruimos la ventana


def example5():
    """
    #*******************************************************
    #Ejemplo 5:
    #Imprimir texto dentro del dibujo:
    #*******************************************************
    """

    # Inicializamos la fuente
    font = cv.InitFont(cv.CV_FONT_VECTOR0, 1, 1, 0, 2, cv.CV_AA)
    pt1 = Point(0, 0)

    img = cv.LoadImage(filename, cv.CV_LOAD_IMAGE_UNCHANGED)
    cv.NamedWindow("Ejemplo5", cv.CV_WINDOW_AUTOSIZE)

    pt1.x = 220
    pt1.y = 30

    cv.PutText(img, "Hola!", (pt1.x, pt1.y), font, cv.CV_RGB(255, 190, 44))

    cv.ShowImage("Ejemplo5", img)
    cv.WaitKey(0)  # Se queda esperando a que se presione una tecla
    cv.DestroyWindow("Ejemplo5")


class Examples(cmd.Cmd):
    """Ejemplos (resueltos)"""

    def do_example1(self, line):
        """Ejemplo 1: abrir foto"""
        example1()

    def do_example2(self, line):
        """Ejemplo 2: dibujar rectángulo"""
        example2()

    def do_example3(self, line):
        """Ejemplo 3: dibujar ROI"""
        example3()

    def do_example4(self, line):
        """Ejemplo 4: redimensionar imagen"""
        example4()

    def do_example5(self, line):
        """Ejemplo 5: imprimir texto"""
        example5()

    def do_EOF(self, line):
        print('\n')
        return True

if __name__ == '__main__':
    Examples().cmdloop()
